#pragma once
#include<iostream>
#include<unistd.h>
#include<cstdlib>
#include<sys/types.h>
#include<sys/wait.h>
#include<string.h>
#include<errno.h>
#include<vector>
#include"task.h"
#include<functional>
//int main()
//{
//    pid_t id = fork();
//
//    if(id == 0)
//    {
//        int cnt = 5;
//        while(cnt--)
//        {
//           std::cout<<"我是子进程 id:"<<getpid()<<std::endl;
//           sleep(1);
//        }
//        exit(111);
//    }
//
//    else
//   {
//
//    int status = 0;
//    pid_t rid = waitpid(id,&status,0);
//    if(rid > 0)
//    {
//        //等待成功
//        //std::cout<<"等待成功 rid:"<<rid<<" status :"<<WEXITSTATUS(status)<<std::endl;
//        //std::cout<<"等待成功 rid:"<<rid<<" status :"<<(status>>8)<<std::endl;
//        if(WIFEXITED(status))
//            {
//                printf("wait sub process success, rid: %d, status code: %d\n", rid, WEXITSTATUS(status)); // ??
//            }
//            else
//            {
//                printf("child process quit error!\n");
//            }
//    }
//    else
//    {
//        perror("waitpid");
//    }
//  
//
//  }
     //for(int i = 0; i < 200; i++)
     //{
     //   std::cout<<"code :"<<i<<"error string : "<<strerror(i)<<std::endl;
     //}
//     printf("before: errno : %d, errstring: %s\n", errno, strerror(errno));
//     FILE* fl = fopen("./log.txt","r");
//     if(fl == nullptr)
//     {
//          printf("after: errno : %d, errstring: %s\n", errno, strerror(errno));
//          return errno;
//     }
//     fclose(fl);
//     return 0;
//}
//

typedef std::function<void()> task_t;

void LoadTask(std::vector<task_t> &tasks)
{
    tasks.push_back(PrintLog);
    tasks.push_back(DownLoad);
    tasks.push_back(Backup);
}


int main()
{
    std::vector<task_t> tasks;
    LoadTask(tasks);

    pid_t id = fork();
    if(id == 0)
    {
        while(true)
        {
            std::cout<<"i'm child id: "<<getpid()<<std::endl;
            sleep(1);
        }
        exit(0);
    }
    else
    {
        while(true)
        {

        sleep(1);
        int status = 0;
        pid_t rid = waitpid(id,&status,WNOHANG);


        if(rid > 0)
        {
            std::cout<<"wait succss "<<rid<<std::endl;
            std::cout<<"退出码"<<WEXITSTATUS(status)<<std::endl;
            break;
        }
        else if(rid < 0)
        {
            std::cout<<"wait failed "<<rid<<std::endl;
            break;
        }
        else
        {
            //加载父进程
            std::cout<<"子进程尚未退出"<<std::endl;

            for(auto & task : tasks)
            {
                task();
            }
        }
     }
    
}

}
